package com.example;

// 结论：
// 1.不仅是实例方法可以重载，静态方法也可以重载
// 2.重载对方法的返回值没有任何限制，意味着重载的方法的返回值可以完全不同
// 3.重载对方法的访问修饰符没有要求，私有方法也可以重载。重载方法的访问修饰符可以不同。
// 4.final方法也可以重载。（由于final关键字只会被用于实例方法，所以本例中没有考虑静态方法，经过我的测试，其实静态方法也可以定义为final，但是没有意义）
public class OverloadTests {

    public static void staticMethod() {
        System.out.println("static method - no return value no arg");
    }

    public static void staticMethod(int arg) {
        System.out.println("static method - arg = " + arg + ", no return value");
    }


    public static String staticMethod(String arg) {
        System.out.println("static method - arg = " + arg + ", String return value");
        return arg;
    }

    public static Boolean staticMethod(boolean arg) {
        System.out.println("static method - arg = " + arg + ", Boolean return value");
        return arg;
    }

    private static Character staticMethod(Character arg) {
        System.out.println("private static method - arg = " + arg + ", Character return value");
        return arg;
    }

    void instanceMethod(){
        System.out.println("instance method - no return value no arg");
    }

    String instanceMethod(String arg) {
        System.out.println("instance method - arg = " + arg + ", String return value");
        return arg;
    }

    final void instanceMethod(int arg) {
        System.out.println("final instance method - arg = " + arg + ", no return value");
    }

    public static void main(String[] args) {
        staticMethod();
        staticMethod(1);
        staticMethod("String");
        staticMethod(true);
        staticMethod(Character.valueOf('C'));

        new OverloadTests().instanceMethod();
        new OverloadTests().instanceMethod("hello");
        new OverloadTests().instanceMethod(1);
    }
}
